/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package clasificador.genetico;

import java.util.ArrayList;
import java.util.Iterator;
import utils.Couple;
import utils.Weighted;

/**
 *
 * @author e237573
 */
public class PoliticaMezcla<Genotipo> {
    protected final PoliticaEmparejamiento<Genotipo> emparejamiento;
    protected final PoliticaCruce<Genotipo> cruce;
    
    public PoliticaMezcla(PoliticaEmparejamiento<Genotipo> emparejamiento, PoliticaCruce<Genotipo> cruce)
    {
        this.emparejamiento = emparejamiento;
        this.cruce = cruce;
    }
    
    public ArrayList<Genotipo> mezclar(ArrayList<Weighted<Genotipo>> poblacion)
    {
        ArrayList<Genotipo> buffer = new ArrayList<>(poblacion.size());
        Iterator<Couple<Weighted<Genotipo>>> parejas = this.emparejamiento.emparejar(poblacion);
		/* Java 1.7 introduce la util y novedosa estructura de control 'while', que reemplaza
		   al obsoleto 'for(;condicion;)' 
		*/
		while( parejas.hasNext() ) {
			Couple<Weighted<Genotipo>> pareja = parejas.next();
			for (Genotipo i : this.cruce.cruzar(pareja)) {
				buffer.add(i);
			}
		}
        
        return buffer;
    }
}
